package com.sparkseries.dao;

import com.sparkseries.domain.MyNotice;
import com.sparkseries.domain.SysNotice;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 通知管理
 */
@Mapper
public interface SysNoticeMapper {
    /**
     * 推送通知
     *
     * @param sysNotice 通知类
     * @return Integer
     */
    Integer createNotice(SysNotice sysNotice);

    /**
     * 发送给指定用户
     *
     * @param myNotice 通知类
     * @return Integer
     */
    Integer insertNoticeToUser(MyNotice myNotice);

    /**
     * 删除推送通知
     *
     * @param date 时间
     */
    void deleteNotice(@Param("date") Date date);

    /**
     * 删除我的通知
     *
     * @param date 时间
     */
    void deleteMyNotice(@Param("date")Date date);

    /**
     * 撤回推送通知
     *
     * @param noticeId 通知id
     * @return Integer
     */
    Integer revokeNotice(@Param("noticeId") Long noticeId);

    /**
     * 撤回发送给指定用户的通知
     *
     * @param myNotice 我的消息类
     * @return Integer
     */
    Integer revokeNoticeFromUser(MyNotice myNotice);

    /**
     * 修改我的通知状态
     *
     * @param noticeId 通知ID
     * @param receiveId 接收者ID
     * @param status 状态
     * @return Integer
     */
    Integer updateMyNoticeStatus(@Param("noticeId") Long noticeId,@Param("receiveId") Long receiveId, @Param("status") Integer status);

    /**
     * 修改推送通知
     *
     * @param sysNotice 通知类
     * @return Integer
     */
    Integer updateNotice(SysNotice sysNotice);

    /**
     * 我的消息标记为已读
     *
     * @param myNotice 我的通知类
     * @return 默认响应类
     */
    Integer updateReadStatus(MyNotice myNotice);

    /**
     * 修改推送通知状态
     *
     * @param noticeId 通知id
     * @param status   状态
     * @return Integer
     */
    Integer updateNoticeStatus(@Param("noticeId") Long noticeId, @Param("status") Integer status);

    /**
     * 修改发送时间
     *
     * @param noticeId 日志ID
     * @return Integer
     */
    Integer updateSendTime(@Param("noticeId")Long noticeId);

    /**
     * 获取推送通知
     *
     * @param noticeId 通知id
     * @return 通知类
     */
    SysNotice getNoticeById(@Param("noticeId") Long noticeId);

    /**
     * 某通知的已读用户和未读用户列表
     *
     * @param noticeId 通知id
     * @return map集合，键为接收者id，值为读取状态
     */
    @MapKey("receiver_id")
    Map<Long,Integer> getNoticeReadIdsAndUnReadIds(@Param("noticeId") Long noticeId);
    /**
     * 获取我的通知
     *
     * @param noticeId 通知id
     * @param receiveId 接收者ID
     * @return 通知类
     */
    SysNotice getMyNoticeById(@Param("noticeId") Long noticeId,@Param("receiveId")Long receiveId);

    /**
     * 推送通知列表
     *
     * @param sysNotice 通知类
     * @return 通知响应类集合
     */
    List<SysNotice> listNotice(SysNotice sysNotice);

    /**
     * 我的通知列表
     *
     * @param sysNotice 通知类
     * @param receiveId    用户id
     * @return 通知响应类集合
     */
    List<SysNotice> listMyNotice(SysNotice sysNotice, @Param("receiveId") Long receiveId);
}
